<!DOCTYPE html>



  


<html class="theme-next mist use-motion" lang="zh-Hans">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<meta name="theme-color" content="#222">



  
  
    
    
  <script src="/kunkun/lib/pace/pace.min.js?v=1.0.2"></script>
  <link href="/kunkun/lib/pace/pace-theme-minimal.min.css?v=1.0.2" rel="stylesheet">







<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />















  
  
  <link href="/kunkun/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />




  
  
  
  

  
    
    
  

  

  

  

  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/kunkun/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/kunkun/css/main.css?v=5.1.2" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="java,多线程," />








  <link rel="shortcut icon" type="image/x-icon" href="/kunkun/favicon.ico?v=5.1.2" />






<meta name="description" content="背景单线程的程序完成的功能比较有限，举例来说，如果想要做一个服务器程序，那么这个服务器程序在对客户端程序提供服务的时候，不同的客户端之间应该互不干扰。">
<meta name="keywords" content="java,多线程">
<meta property="og:type" content="article">
<meta property="og:title" content="多线程知识梳理">
<meta property="og:url" content="http://yoursite.com/2017/12/01/多线程知识梳理/index.html">
<meta property="og:site_name" content="hasaki">
<meta property="og:description" content="背景单线程的程序完成的功能比较有限，举例来说，如果想要做一个服务器程序，那么这个服务器程序在对客户端程序提供服务的时候，不同的客户端之间应该互不干扰。">
<meta property="og:locale" content="zh-Hans">
<meta property="og:image" content="http://ozypoe1ag.bkt.clouddn.com/201712011259_426.png">
<meta property="og:image" content="http://ozypoe1ag.bkt.clouddn.com/201712011303_174.png">
<meta property="og:image" content="http://ozypoe1ag.bkt.clouddn.com/201712011418_718.png">
<meta property="og:updated_time" content="2017-12-01T10:53:04.070Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="多线程知识梳理">
<meta name="twitter:description" content="背景单线程的程序完成的功能比较有限，举例来说，如果想要做一个服务器程序，那么这个服务器程序在对客户端程序提供服务的时候，不同的客户端之间应该互不干扰。">
<meta name="twitter:image" content="http://ozypoe1ag.bkt.clouddn.com/201712011259_426.png">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/kunkun/',
    scheme: 'Mist',
    sidebar: {"position":"right","display":"hide","offset":12,"offset_float":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: true,
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://yoursite.com/2017/12/01/多线程知识梳理/"/>





  <title>多线程知识梳理 | hasaki</title>
  














</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  
  
    
  

  <div class="container sidebar-position-right page-post-detail ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/kunkun/"  class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">hasaki</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle">求知若渴，虚心若愚</p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/kunkun/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/kunkun/categories/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/kunkun/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/kunkun/tags/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
            
            标签
          </a>
        </li>
      

      
        <li class="menu-item menu-item-search">
          
            <a href="javascript:;" class="popup-trigger">
          
            
              <i class="menu-item-icon fa fa-search fa-fw"></i> <br />
            
            搜索
          </a>
        </li>
      
    </ul>
  

  
    <div class="site-search">
      
  <div class="popup search-popup local-search-popup">
  <div class="local-search-header clearfix">
    <span class="search-icon">
      <i class="fa fa-search"></i>
    </span>
    <span class="popup-btn-close">
      <i class="fa fa-times-circle"></i>
    </span>
    <div class="local-search-input-wrapper">
      <input autocomplete="off"
             placeholder="搜索..." spellcheck="false"
             type="text" id="local-search-input">
    </div>
  </div>
  <div id="local-search-result"></div>
</div>



    </div>
  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://yoursite.com/kunkun/2017/12/01/多线程知识梳理/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="hasaki">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/kunkun/images/touxiang.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="hasaki">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">多线程知识梳理</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2017-12-01T10:13:55+08:00">
                2017-12-01
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/kunkun/categories/java基础/" itemprop="url" rel="index">
                    <span itemprop="name">java基础</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
            <!--noindex-->
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <span class="post-meta-item-icon">
                  <i class="fa fa-comment-o"></i>
                </span>
                <a href="/kunkun/2017/12/01/多线程知识梳理/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count hc-comment-count" data-xid="2017/12/01/多线程知识梳理/" itemprop="commentsCount"></span>
                </a>
              </span>
              <!--/noindex-->
            
          

          
          

          
            <span class="post-meta-divider">|</span>
            <span class="page-pv">本文总阅读量
            <span class="busuanzi-value" id="busuanzi_value_page_pv" ></span>
            </span>
          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <h3 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h3><p>单线程的程序完成的功能比较有限，举例来说，如果想要做一个服务器程序，那么这个服务器程序在对客户端程序提供服务的时候，不同的客户端之间应该互不干扰。</p>
<a id="more"></a>
<h3 id="优点"><a href="#优点" class="headerlink" title="优点"></a>优点</h3><ul>
<li>多线程技术使程序的响应速度更快 ,因为用户界面可以在进行其它工作的同时一直处于活动状态;</li>
<li>当前没有进行处理的任务时可以将处理器时间让给其它任务;</li>
<li>占用大量处理时间的任务可以定期将处理器时间让给其它任务;</li>
<li>可以随时停止任务;</li>
<li>可以分别设置各个任务的优先级以优化性能。</li>
</ul>
<h3 id="缺点"><a href="#缺点" class="headerlink" title="缺点"></a>缺点</h3><ul>
<li>等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。</li>
<li>对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。</li>
<li>线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。</li>
<li>对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的</li>
</ul>
<h3 id="什么时候适合使用多线程？"><a href="#什么时候适合使用多线程？" class="headerlink" title="什么时候适合使用多线程？"></a>什么时候适合使用多线程？</h3><ul>
<li>耗时或大量占用处理器的任务阻塞用户界面操作;</li>
<li>各个任务必须等待外部资源 (如远程文件或 Internet连接)。</li>
</ul>
<h3 id="多线程实例"><a href="#多线程实例" class="headerlink" title="多线程实例"></a>多线程实例</h3><ul>
<li>浏览器同时下载多个文件为多线程</li>
<li>web服务器同时响应多个用户请求为多线程</li>
<li>GUI程序中，有个线程在后台监控界面发生的事件，为多线程</li>
<li>jvm垃圾回收线程</li>
</ul>
<h3 id="术语"><a href="#术语" class="headerlink" title="术语"></a>术语</h3><ul>
<li>线程：有时被称为轻量级进程(Lightweight Process，LWP），是程序执行流的最小单元。</li>
<li>进程：是计算机中的程序关于某数据集合上的一次运行活动，是系统进行资源分配和调度的基本单位，是操作系统结构的基础。在早期面向进程设计的计算机结构中，进程是程序的基本执行实体；在当代面向线程设计的计算机结构中，进程是线程的容器。</li>
<li>线程安全：就是多线程访问时，采用了加锁机制，当一个线程访问该类的某个数据时，进行保护，其他线程不能进行访问直到该线程读取完，其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护，有可能出现多个线程先后更改数据造成所得到的数据是脏数据</li>
<li>线程同步：多线程编程里面，一些敏感数据不允许被多个线程同时访问，此时就使用同步访问技术，保证数据在任何时刻，最多有一个线程访问，以保证数据的完整性。</li>
<li>线程互斥：线程互斥是指某一资源同时只允许一个访问者对其进行访问，具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序，即访问是无序的。</li>
<li>线程阻塞：指一个线程在执行过程中暂停，以等待某个条件的触发。</li>
<li>线程调度：计算机的每个cpu在某个任意时刻只能执行一条指令，每个线程只有获得了cpu的使用权，才可能被cpu执行。线程调度是指按照特定机制为多个线程分配CPU的使用权.</li>
<li>同步：就是指一个进程在执行某个请求的时候，若该请求需要一段时间才能返回信息，那么这个进程将会一直等待下去，直到收到返回信息才继续执行下去。</li>
<li>异步：指线程不需要一直等下去，而是继续执行下面的操作，不管其他线程的状态。当有消息返回时系统会通知线程进行处理，这样可以提高执行的效率。</li>
</ul>
<h3 id="基础知识"><a href="#基础知识" class="headerlink" title="基础知识"></a>基础知识</h3><h4 id="进程的三个特性"><a href="#进程的三个特性" class="headerlink" title="进程的三个特性"></a>进程的三个特性</h4><ul>
<li>独立性：进程拥有独立的内存空间，未经进程允许，其他进程不能访问该进程的内存空间</li>
<li>动态性：进程拥有生命周期，拥有自己的状态。与程序不同的是，程序是死的，是指令的集合。但是进程是活的。</li>
<li>并发性：多个进程可以在单个处理器上并发执行，互不影响</li>
</ul>
<h4 id="线程与进程的关系"><a href="#线程与进程的关系" class="headerlink" title="线程与进程的关系"></a>线程与进程的关系</h4><ul>
<li>线程是轻量级的进程</li>
<li>进程是线程的容器，一个进程至少包含一个主线程</li>
<li>线程不能脱离进程存在</li>
</ul>
<h4 id="线程与线程之间"><a href="#线程与线程之间" class="headerlink" title="线程与线程之间"></a>线程与线程之间</h4><ul>
<li>同一父进程下面的多个线程共享父进程的内存资源</li>
<li>线程运行时独立的</li>
<li>线程之间获取进程内存空间中的资源是抢占式的</li>
</ul>
<h4 id="多进程与多线程比较"><a href="#多进程与多线程比较" class="headerlink" title="多进程与多线程比较"></a>多进程与多线程比较</h4><ul>
<li>多进程之间共享内存不易，但是多线程之间共享内存相对简单</li>
<li>多进程代价太大（系统需要为新进程重新分配资源），但是多线程创建代价要小得多</li>
</ul>
<h4 id="创建线程的三种方式"><a href="#创建线程的三种方式" class="headerlink" title="创建线程的三种方式"></a>创建线程的三种方式</h4><ul>
<li><p>继承Thread类</p>
<pre><code>public class FirstThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i &lt; 100; i++) {
            System.out.println(this.getName()+&quot; &quot;+i);
        }
    }

    public FirstThread(String name) {
        super(name);
    }

    public static void main(String[] args) {
        //使用Thread.currentThread()可以获取当前线程对象
        System.out.println(Thread.currentThread().getName());
        for (int i = 0; i &lt; 100; i++) {
            if (i == 20 ){
                new FirstThread(&quot;aa&quot;).start();
                new FirstThread(&quot;bb&quot;).start();
            }
        }
    }
}
</code></pre></li>
</ul>
<p>运行效果：<br><img src="http://ozypoe1ag.bkt.clouddn.com/201712011259_426.png" alt=""></p>
<ul>
<li><p>实现Runnable接口</p>
<pre><code>public class SecondThread implements Runnable {

private int i;

public void run() {
    for ( ; i &lt; 100; i++) {
        System.out.println(Thread.currentThread().getName()+&quot; &quot;+i);
    }
}

public static void main(String[] args) {
    for (int i = 0; i &lt; 100; i++) {
        System.out.println(Thread.currentThread().getName()+&quot; &quot;+i);
        if (i == 20){
            SecondThread secondThread = new SecondThread();
            new Thread(secondThread).start();
            new Thread(secondThread).start();
        }
    }
}
}
</code></pre></li>
</ul>
<p>运行效果：<br><img src="http://ozypoe1ag.bkt.clouddn.com/201712011303_174.png" alt=""></p>
<ul>
<li><p>使用Callable和Future</p>
<pre><code>import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class ThirdThread{
public static void main(String [] args){
    //创建Callable对象            
    ThirdThread rt = new ThirdThread();
    FutureTask&lt;Integer&gt; task = new FutureTask&lt;Integer&gt;((Callable&lt;Integer&gt;)() -&gt; {
        int i = 0;
        for(;i&lt;100;i++){
            System.out.println(Thread.currentThread().getName()+&quot; i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&quot;+i);
        }
        return i;
    });
    for(int i = 0;i&lt;100;i++){
        System.out.println(Thread.currentThread().getName() + &quot; 的循环变量i的值：&quot; + i);
        if(i == 20){
            new Thread(task,&quot;有返回值的线程&quot;).start();
        }
    }    
    try{
        System.out.println(&quot;子线程的返回值：&quot; + task.get());
    }catch(Exception e){
        e.printStackTrace();
    }    
}    
}
</code></pre></li>
</ul>
<p>运行结果：</p>
<pre><code>main 的循环变量i的值：0
main 的循环变量i的值：1
main 的循环变量i的值：2
main 的循环变量i的值：3
main 的循环变量i的值：4
main 的循环变量i的值：5
main 的循环变量i的值：6
main 的循环变量i的值：7
main 的循环变量i的值：8
main 的循环变量i的值：9
main 的循环变量i的值：10
main 的循环变量i的值：11
main 的循环变量i的值：12
main 的循环变量i的值：13
main 的循环变量i的值：14
main 的循环变量i的值：15
main 的循环变量i的值：16
main 的循环变量i的值：17
main 的循环变量i的值：18
main 的循环变量i的值：19
main 的循环变量i的值：20
main 的循环变量i的值：21
main 的循环变量i的值：22
main 的循环变量i的值：23
main 的循环变量i的值：24
main 的循环变量i的值：25
main 的循环变量i的值：26
main 的循环变量i的值：27
main 的循环变量i的值：28
main 的循环变量i的值：29
main 的循环变量i的值：30
main 的循环变量i的值：31
main 的循环变量i的值：32
main 的循环变量i的值：33
main 的循环变量i的值：34
main 的循环变量i的值：35
main 的循环变量i的值：36
main 的循环变量i的值：37
main 的循环变量i的值：38
main 的循环变量i的值：39
main 的循环变量i的值：40
main 的循环变量i的值：41
main 的循环变量i的值：42
main 的循环变量i的值：43
main 的循环变量i的值：44
main 的循环变量i的值：45
main 的循环变量i的值：46
main 的循环变量i的值：47
main 的循环变量i的值：48
main 的循环变量i的值：49
main 的循环变量i的值：50
main 的循环变量i的值：51
main 的循环变量i的值：52
main 的循环变量i的值：53
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;0
main 的循环变量i的值：54
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;1
main 的循环变量i的值：55
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;2
main 的循环变量i的值：56
main 的循环变量i的值：57
main 的循环变量i的值：58
main 的循环变量i的值：59
main 的循环变量i的值：60
main 的循环变量i的值：61
main 的循环变量i的值：62
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;3
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;4
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;5
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;6
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;7
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;8
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;9
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;10
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;11
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;12
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;13
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;14
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;15
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;16
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;17
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;18
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;19
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;20
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;21
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;22
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;23
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;24
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;25
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;26
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;27
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;28
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;29
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;30
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;31
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;32
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;33
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;34
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;35
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;36
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;37
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;38
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;39
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;40
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;41
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;42
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;43
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;44
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;45
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;46
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;47
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;48
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;49
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;50
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;51
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;52
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;53
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;54
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;55
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;56
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;57
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;58
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;59
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;60
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;61
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;62
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;63
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;64
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;65
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;66
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;67
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;68
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;69
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;70
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;71
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;72
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;73
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;74
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;75
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;76
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;77
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;78
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;79
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;80
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;81
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;82
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;83
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;84
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;85
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;86
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;87
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;88
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;89
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;90
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;91
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;92
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;93
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;94
main 的循环变量i的值：63
main 的循环变量i的值：64
main 的循环变量i的值：65
main 的循环变量i的值：66
main 的循环变量i的值：67
main 的循环变量i的值：68
main 的循环变量i的值：69
main 的循环变量i的值：70
main 的循环变量i的值：71
main 的循环变量i的值：72
main 的循环变量i的值：73
main 的循环变量i的值：74
main 的循环变量i的值：75
main 的循环变量i的值：76
main 的循环变量i的值：77
main 的循环变量i的值：78
main 的循环变量i的值：79
main 的循环变量i的值：80
main 的循环变量i的值：81
main 的循环变量i的值：82
main 的循环变量i的值：83
main 的循环变量i的值：84
main 的循环变量i的值：85
main 的循环变量i的值：86
main 的循环变量i的值：87
main 的循环变量i的值：88
main 的循环变量i的值：89
main 的循环变量i的值：90
main 的循环变量i的值：91
main 的循环变量i的值：92
main 的循环变量i的值：93
main 的循环变量i的值：94
main 的循环变量i的值：95
main 的循环变量i的值：96
main 的循环变量i的值：97
main 的循环变量i的值：98
main 的循环变量i的值：99
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;95
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;96
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;97
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;98
有返回值的线程 i的值=================================&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;99
子线程的返回值：100
</code></pre><h4 id="三种创建线程的方法比较"><a href="#三种创建线程的方法比较" class="headerlink" title="三种创建线程的方法比较"></a>三种创建线程的方法比较</h4><ul>
<li>实现Runnable接口与实现Callable接口几乎相同，只是实现Callable接口可以有返回值，可以抛出异常。</li>
<li>实现接口的方式还可以继承其他类</li>
<li>实现接口的方式可以使得多个线程共享一个target对象，非常适合多个相同的线程处理同一份资源的情况</li>
<li>采用继承Thread类的方式创建线程相对简单，但是不够灵活</li>
</ul>
<h4 id="线程的生命周期"><a href="#线程的生命周期" class="headerlink" title="线程的生命周期"></a>线程的生命周期</h4><p>一个线程的生命周期中会经历五种状态</p>
<ul>
<li><p>新建（New)</p>
<ul>
<li>通过new关键字创建线程对象之后，jvm为该对象分配内存空间，并初始化其成员变量。此时的线程对象与普通java对象没有什么区别，它还没有表现出一个线程的动态特性。并不会执行动态代码</li>
<li>只有新建状态的线程才可以调用start方法，其他状态的线程调用此方法会抛出<code>IllegalThreadStateException</code></li>
</ul>
</li>
<li><p>就绪（Runnable）</p>
<p>  当线程对象调用了start方法以后，线程处于就绪状态。但是此时线程并没有真正的执行，这个状态只是说明，线程有能力执行了，jvm会为这个线程对象创建调用栈以及程序计数器。但是具体什么时候运行，取决于jvm调度器的调度。</p>
</li>
<li><p>运行（Running）</p>
<p>  当处于就绪状态的线程被调度，获得了cpu执行权。那么这个线程就开始执行线程体，此时线程就处于运行状态。</p>
</li>
<li><p>阻塞（Blocked）</p>
<p>  线程的运行并非是一帆风顺的，除非这个线程执行的时间特别短，这种情况可能这个线程顺利的执行完了。否则发生下列情况时，线程将会被阻塞</p>
<ul>
<li>线程调用sleep()方法主动放弃cpu的资源</li>
<li>线程调用了一个IO方法，在该方法返回之前，线程被阻塞</li>
<li>线程在等待某个通知（notify）</li>
<li>程序调用了线程的suspend()方法挂起线程，这个方法容易使得线程发生死锁，尽量避免采用</li>
</ul>
</li>
</ul>
<ul>
<li>死亡（Dead）<br>  当线程出现下面三种情况时，线程的一生就终止了<ul>
<li>run方法或是call方法执行完毕，线程正常结束</li>
<li>线程抛出未捕获的异常</li>
<li>直接调用线程的stop方法，该方法可能会引起线程死锁，不推荐。</li>
</ul>
</li>
</ul>
<h4 id="生命周期状态转换图"><a href="#生命周期状态转换图" class="headerlink" title="生命周期状态转换图"></a>生命周期状态转换图</h4><p><img src="http://ozypoe1ag.bkt.clouddn.com/201712011418_718.png" alt=""></p>
<h4 id="执行start方法与执行run方法的区别"><a href="#执行start方法与执行run方法的区别" class="headerlink" title="执行start方法与执行run方法的区别"></a>执行start方法与执行run方法的区别</h4><ul>
<li>启动线程用调的是start方法，而不是run方法</li>
<li>调用线程对象的start方法最终执行的还是run方法</li>
<li><p>如果直接调用run方法，jvm会把线程对象当成普通对象对待，直接执行run方法。此时run方法就是一个普通方法，而不是线程执行体。</p>
<pre><code>public class FourThread extends Thread {
    public FourThread(String string) {
    }

    @Override
    public void run() {
        for (int i = 0; i &lt; 100; i++) {
            System.out.println(Thread.currentThread().getName()+&quot; &quot;+i);
        }
    }

    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
        for (int i = 0; i &lt; 100; i++) {
            if (i == 20 ){
                new FourThread(&quot;hahha&quot;).run();
                new FourThread(&quot;aaa&quot;).run();
            }
        }
    }
}
</code></pre></li>
</ul>
<p>上面代码的执行结果发现，只有main线程。并没有hahha与aaa线程</p>
<h4 id="系统调度策略"><a href="#系统调度策略" class="headerlink" title="系统调度策略"></a>系统调度策略</h4><ul>
<li>抢占式调度策略<br>  现代的服务器或是桌面系统大多采用这种策略。这种策略下，系统会划分时间片，当一段时间片过去之后，系统会剥夺该时间片中运行的线程所占有的资源，以使得下个时间片中其他线程有机会执行。</li>
<li>协作式调度策略<br>  可能会有一些系统采取协作式调度策略。在这种策略下，一个线程必须主动放弃cpu的资源才能使得其他线程能够获得资源</li>
</ul>
<h4 id="isAlive-方法"><a href="#isAlive-方法" class="headerlink" title="isAlive()方法"></a>isAlive()方法</h4><p>该方法用于判断一个线程是否已经死亡</p>
<ul>
<li>在新建状态以及死亡状态，该方法返回为true</li>
<li>其他三种状态，该方法返回为false</li>
</ul>
<h3 id="进阶"><a href="#进阶" class="headerlink" title="进阶"></a>进阶</h3><h4 id="控制线程（重要）"><a href="#控制线程（重要）" class="headerlink" title="控制线程（重要）"></a>控制线程（重要）</h4>
      
    </div>
    
    
    

    

    
      <div>
        <div style="padding: 10px 0; margin: 20px auto; width: 90%; text-align: center;">
  <div>赏钱吃饭</div>
  <button id="rewardButton" disable="enable" onclick="var qr = document.getElementById('QR'); if (qr.style.display === 'none') {qr.style.display='block';} else {qr.style.display='none'}">
    <span>Donate</span>
  </button>
  <div id="QR" style="display: none;">

    
      <div id="wechat" style="display: inline-block">
        <img id="wechat_qr" src="/kunkun/images/weixin.png" alt="hasaki WeChat Pay"/>
        <p>WeChat Pay</p>
      </div>
    

    
      <div id="alipay" style="display: inline-block">
        <img id="alipay_qr" src="/kunkun/images/zhifubao.png" alt="hasaki Alipay"/>
        <p>Alipay</p>
      </div>
    

    

  </div>
</div>

      </div>
    

    

    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/kunkun/tags/java/" rel="tag"># java</a>
          
            <a href="/kunkun/tags/多线程/" rel="tag"># 多线程</a>
          
        </div>
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/kunkun/2017/11/30/java泛型/" rel="next" title="java泛型">
                <i class="fa fa-chevron-left"></i> java泛型
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/kunkun/2017/12/01/Lambda表达式/" rel="prev" title="Lambda表达式">
                Lambda表达式 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          
  <div class="comments" id="comments">
    
      <div id="hypercomments_widget"></div>
    
  </div>


        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/kunkun/images/touxiang.jpg"
               alt="hasaki" />
          <p class="site-author-name" itemprop="name">hasaki</p>
           
              <p class="site-description motion-element" itemprop="description">求知若渴，虚心若愚</p>
          
        </div>
        <nav class="site-state motion-element">

          
            <div class="site-state-item site-state-posts">
              <a href="/kunkun/archives/">
                <span class="site-state-item-count">8</span>
                <span class="site-state-item-name">日志</span>
              </a>
            </div>
          

          
            
            
            <div class="site-state-item site-state-categories">
              <a href="/kunkun/categories/index.html">
                <span class="site-state-item-count">5</span>
                <span class="site-state-item-name">分类</span>
              </a>
            </div>
          

          
            
            
            <div class="site-state-item site-state-tags">
              <a href="/kunkun/tags/index.html">
                <span class="site-state-item-count">17</span>
                <span class="site-state-item-name">标签</span>
              </a>
            </div>
          

        </nav>

        

        <div class="links-of-author motion-element">
          
            
              <span class="links-of-author-item">
                <a href="https://github.com/kun95" target="_blank" title="GitHub">
                  
                    
                      GitHub
                    
                </a>
              </span>
            
              <span class="links-of-author-item">
                <a href="https://www.zhihu.com/people/kunkuna-17/activities" target="_blank" title="知乎">
                  
                    
                      知乎
                    
                </a>
              </span>
            
          
        </div>

        
        

        
        

        


      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-3"><a class="nav-link" href="#背景"><span class="nav-number">1.</span> <span class="nav-text">背景</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#优点"><span class="nav-number">2.</span> <span class="nav-text">优点</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#缺点"><span class="nav-number">3.</span> <span class="nav-text">缺点</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#什么时候适合使用多线程？"><span class="nav-number">4.</span> <span class="nav-text">什么时候适合使用多线程？</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#多线程实例"><span class="nav-number">5.</span> <span class="nav-text">多线程实例</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#术语"><span class="nav-number">6.</span> <span class="nav-text">术语</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#基础知识"><span class="nav-number">7.</span> <span class="nav-text">基础知识</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#进程的三个特性"><span class="nav-number">7.1.</span> <span class="nav-text">进程的三个特性</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#线程与进程的关系"><span class="nav-number">7.2.</span> <span class="nav-text">线程与进程的关系</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#线程与线程之间"><span class="nav-number">7.3.</span> <span class="nav-text">线程与线程之间</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#多进程与多线程比较"><span class="nav-number">7.4.</span> <span class="nav-text">多进程与多线程比较</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#创建线程的三种方式"><span class="nav-number">7.5.</span> <span class="nav-text">创建线程的三种方式</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#三种创建线程的方法比较"><span class="nav-number">7.6.</span> <span class="nav-text">三种创建线程的方法比较</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#线程的生命周期"><span class="nav-number">7.7.</span> <span class="nav-text">线程的生命周期</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#生命周期状态转换图"><span class="nav-number">7.8.</span> <span class="nav-text">生命周期状态转换图</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#执行start方法与执行run方法的区别"><span class="nav-number">7.9.</span> <span class="nav-text">执行start方法与执行run方法的区别</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#系统调度策略"><span class="nav-number">7.10.</span> <span class="nav-text">系统调度策略</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#isAlive-方法"><span class="nav-number">7.11.</span> <span class="nav-text">isAlive()方法</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#进阶"><span class="nav-number">8.</span> <span class="nav-text">进阶</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#控制线程（重要）"><span class="nav-number">8.1.</span> <span class="nav-text">控制线程（重要）</span></a></li></ol></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy; 
  <span itemprop="copyrightYear">2017</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">hasaki</span>
</div>


<div class="powered-by">
  由 <a class="theme-link" href="https://hexo.io">Hexo</a> 强力驱动
</div>

<div class="theme-info">
  主题 -
  <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
    NexT.Mist
  </a>
</div>


        
<div class="busuanzi-count">
  <script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>

  
    <span class="site-uv">
      本站访客数
      <span class="busuanzi-value" id="busuanzi_value_site_uv"></span>
      
    </span>
  

  
    <span class="site-pv">
      本站总访问量
      <span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
      
    </span>
  
</div>


        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  






  
  







  
  <script type="text/javascript" src="/kunkun/lib/jquery/index.js?v=2.1.3"></script>

  
  <script type="text/javascript" src="/kunkun/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  
  <script type="text/javascript" src="/kunkun/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  
  <script type="text/javascript" src="/kunkun/lib/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/kunkun/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/kunkun/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>

  
  <script type="text/javascript" src="/kunkun/lib/three/three.min.js"></script>

  
  <script type="text/javascript" src="/kunkun/lib/three/canvas_lines.min.js"></script>


  


  <script type="text/javascript" src="/kunkun/js/src/utils.js?v=5.1.2"></script>

  <script type="text/javascript" src="/kunkun/js/src/motion.js?v=5.1.2"></script>



  
  

  
  <script type="text/javascript" src="/kunkun/js/src/scrollspy.js?v=5.1.2"></script>
<script type="text/javascript" src="/kunkun/js/src/post-details.js?v=5.1.2"></script>



  


  <script type="text/javascript" src="/kunkun/js/src/bootstrap.js?v=5.1.2"></script>



  


  




	

		<script type="text/javascript">
		_hcwp = window._hcwp || [];

		_hcwp.push({widget:"Bloggerstream", widget_id: 98413, selector:".hc-comment-count", label: "{\%COUNT%\}" });

		
		_hcwp.push({widget:"Stream", widget_id: 98413, xid: "2017/12/01/多线程知识梳理/"});
		

		(function() {
		if("HC_LOAD_INIT" in window)return;
		HC_LOAD_INIT = true;
		var lang = (navigator.language || navigator.systemLanguage || navigator.userLanguage || "en").substr(0, 2).toLowerCase();
		var hcc = document.createElement("script"); hcc.type = "text/javascript"; hcc.async = true;
		hcc.src = ("https:" == document.location.protocol ? "https" : "http")+"://w.hypercomments.com/widget/hc/98413/"+lang+"/widget.js";
		var s = document.getElementsByTagName("script")[0];
		s.parentNode.insertBefore(hcc, s.nextSibling);
		})();
		</script>

	










  

  <script type="text/javascript">
    // Popup Window;
    var isfetched = false;
    var isXml = true;
    // Search DB path;
    var search_path = "search.xml";
    if (search_path.length === 0) {
      search_path = "search.xml";
    } else if (/json$/i.test(search_path)) {
      isXml = false;
    }
    var path = "/kunkun/" + search_path;
    // monitor main search box;

    var onPopupClose = function (e) {
      $('.popup').hide();
      $('#local-search-input').val('');
      $('.search-result-list').remove();
      $('#no-result').remove();
      $(".local-search-pop-overlay").remove();
      $('body').css('overflow', '');
    }

    function proceedsearch() {
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay"></div>')
        .css('overflow', 'hidden');
      $('.search-popup-overlay').click(onPopupClose);
      $('.popup').toggle();
      var $localSearchInput = $('#local-search-input');
      $localSearchInput.attr("autocapitalize", "none");
      $localSearchInput.attr("autocorrect", "off");
      $localSearchInput.focus();
    }

    // search function;
    var searchFunc = function(path, search_id, content_id) {
      'use strict';

      // start loading animation
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay">' +
          '<div id="search-loading-icon">' +
          '<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>' +
          '</div>' +
          '</div>')
        .css('overflow', 'hidden');
      $("#search-loading-icon").css('margin', '20% auto 0 auto').css('text-align', 'center');

      $.ajax({
        url: path,
        dataType: isXml ? "xml" : "json",
        async: true,
        success: function(res) {
          // get the contents from search data
          isfetched = true;
          $('.popup').detach().appendTo('.header-inner');
          var datas = isXml ? $("entry", res).map(function() {
            return {
              title: $("title", this).text(),
              content: $("content",this).text(),
              url: $("url" , this).text()
            };
          }).get() : res;
          var input = document.getElementById(search_id);
          var resultContent = document.getElementById(content_id);
          var inputEventFunction = function() {
            var searchText = input.value.trim().toLowerCase();
            var keywords = searchText.split(/[\s\-]+/);
            if (keywords.length > 1) {
              keywords.push(searchText);
            }
            var resultItems = [];
            if (searchText.length > 0) {
              // perform local searching
              datas.forEach(function(data) {
                var isMatch = false;
                var hitCount = 0;
                var searchTextCount = 0;
                var title = data.title.trim();
                var titleInLowerCase = title.toLowerCase();
                var content = data.content.trim().replace(/<[^>]+>/g,"");
                var contentInLowerCase = content.toLowerCase();
                var articleUrl = decodeURIComponent(data.url);
                var indexOfTitle = [];
                var indexOfContent = [];
                // only match articles with not empty titles
                if(title != '') {
                  keywords.forEach(function(keyword) {
                    function getIndexByWord(word, text, caseSensitive) {
                      var wordLen = word.length;
                      if (wordLen === 0) {
                        return [];
                      }
                      var startPosition = 0, position = [], index = [];
                      if (!caseSensitive) {
                        text = text.toLowerCase();
                        word = word.toLowerCase();
                      }
                      while ((position = text.indexOf(word, startPosition)) > -1) {
                        index.push({position: position, word: word});
                        startPosition = position + wordLen;
                      }
                      return index;
                    }

                    indexOfTitle = indexOfTitle.concat(getIndexByWord(keyword, titleInLowerCase, false));
                    indexOfContent = indexOfContent.concat(getIndexByWord(keyword, contentInLowerCase, false));
                  });
                  if (indexOfTitle.length > 0 || indexOfContent.length > 0) {
                    isMatch = true;
                    hitCount = indexOfTitle.length + indexOfContent.length;
                  }
                }

                // show search results

                if (isMatch) {
                  // sort index by position of keyword

                  [indexOfTitle, indexOfContent].forEach(function (index) {
                    index.sort(function (itemLeft, itemRight) {
                      if (itemRight.position !== itemLeft.position) {
                        return itemRight.position - itemLeft.position;
                      } else {
                        return itemLeft.word.length - itemRight.word.length;
                      }
                    });
                  });

                  // merge hits into slices

                  function mergeIntoSlice(text, start, end, index) {
                    var item = index[index.length - 1];
                    var position = item.position;
                    var word = item.word;
                    var hits = [];
                    var searchTextCountInSlice = 0;
                    while (position + word.length <= end && index.length != 0) {
                      if (word === searchText) {
                        searchTextCountInSlice++;
                      }
                      hits.push({position: position, length: word.length});
                      var wordEnd = position + word.length;

                      // move to next position of hit

                      index.pop();
                      while (index.length != 0) {
                        item = index[index.length - 1];
                        position = item.position;
                        word = item.word;
                        if (wordEnd > position) {
                          index.pop();
                        } else {
                          break;
                        }
                      }
                    }
                    searchTextCount += searchTextCountInSlice;
                    return {
                      hits: hits,
                      start: start,
                      end: end,
                      searchTextCount: searchTextCountInSlice
                    };
                  }

                  var slicesOfTitle = [];
                  if (indexOfTitle.length != 0) {
                    slicesOfTitle.push(mergeIntoSlice(title, 0, title.length, indexOfTitle));
                  }

                  var slicesOfContent = [];
                  while (indexOfContent.length != 0) {
                    var item = indexOfContent[indexOfContent.length - 1];
                    var position = item.position;
                    var word = item.word;
                    // cut out 100 characters
                    var start = position - 20;
                    var end = position + 80;
                    if(start < 0){
                      start = 0;
                    }
                    if (end < position + word.length) {
                      end = position + word.length;
                    }
                    if(end > content.length){
                      end = content.length;
                    }
                    slicesOfContent.push(mergeIntoSlice(content, start, end, indexOfContent));
                  }

                  // sort slices in content by search text's count and hits' count

                  slicesOfContent.sort(function (sliceLeft, sliceRight) {
                    if (sliceLeft.searchTextCount !== sliceRight.searchTextCount) {
                      return sliceRight.searchTextCount - sliceLeft.searchTextCount;
                    } else if (sliceLeft.hits.length !== sliceRight.hits.length) {
                      return sliceRight.hits.length - sliceLeft.hits.length;
                    } else {
                      return sliceLeft.start - sliceRight.start;
                    }
                  });

                  // select top N slices in content

                  var upperBound = parseInt('1');
                  if (upperBound >= 0) {
                    slicesOfContent = slicesOfContent.slice(0, upperBound);
                  }

                  // highlight title and content

                  function highlightKeyword(text, slice) {
                    var result = '';
                    var prevEnd = slice.start;
                    slice.hits.forEach(function (hit) {
                      result += text.substring(prevEnd, hit.position);
                      var end = hit.position + hit.length;
                      result += '<b class="search-keyword">' + text.substring(hit.position, end) + '</b>';
                      prevEnd = end;
                    });
                    result += text.substring(prevEnd, slice.end);
                    return result;
                  }

                  var resultItem = '';

                  if (slicesOfTitle.length != 0) {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + highlightKeyword(title, slicesOfTitle[0]) + "</a>";
                  } else {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + title + "</a>";
                  }

                  slicesOfContent.forEach(function (slice) {
                    resultItem += "<a href='" + articleUrl + "'>" +
                      "<p class=\"search-result\">" + highlightKeyword(content, slice) +
                      "...</p>" + "</a>";
                  });

                  resultItem += "</li>";
                  resultItems.push({
                    item: resultItem,
                    searchTextCount: searchTextCount,
                    hitCount: hitCount,
                    id: resultItems.length
                  });
                }
              })
            };
            if (keywords.length === 1 && keywords[0] === "") {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-search fa-5x" /></div>'
            } else if (resultItems.length === 0) {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-frown-o fa-5x" /></div>'
            } else {
              resultItems.sort(function (resultLeft, resultRight) {
                if (resultLeft.searchTextCount !== resultRight.searchTextCount) {
                  return resultRight.searchTextCount - resultLeft.searchTextCount;
                } else if (resultLeft.hitCount !== resultRight.hitCount) {
                  return resultRight.hitCount - resultLeft.hitCount;
                } else {
                  return resultRight.id - resultLeft.id;
                }
              });
              var searchResultList = '<ul class=\"search-result-list\">';
              resultItems.forEach(function (result) {
                searchResultList += result.item;
              })
              searchResultList += "</ul>";
              resultContent.innerHTML = searchResultList;
            }
          }

          if ('auto' === 'auto') {
            input.addEventListener('input', inputEventFunction);
          } else {
            $('.search-icon').click(inputEventFunction);
            input.addEventListener('keypress', function (event) {
              if (event.keyCode === 13) {
                inputEventFunction();
              }
            });
          }

          // remove loading animation
          $(".local-search-pop-overlay").remove();
          $('body').css('overflow', '');

          proceedsearch();
        }
      });
    }

    // handle and trigger popup window;
    $('.popup-trigger').click(function(e) {
      e.stopPropagation();
      if (isfetched === false) {
        searchFunc(path, 'local-search-input', 'local-search-result');
      } else {
        proceedsearch();
      };
    });

    $('.popup-btn-close').click(onPopupClose);
    $('.popup').click(function(e){
      e.stopPropagation();
    });
    $(document).on('keyup', function (event) {
      var shouldDismissSearchPopup = event.which === 27 &&
        $('.search-popup').is(':visible');
      if (shouldDismissSearchPopup) {
        onPopupClose();
      }
    });
  </script>





  

  

  

  

  

  

</body>
</html>
